home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / exampleCode / irix / tools / printf.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  4.7 KB  |  299 lines

  1. /*------------------------------------------------------------------------
  2.  * $Id: printf.c,v 1.1 1993/10/25 13:15:20 carlson Exp $
  3.  *
  4.  * This program emulates the printf function in C.
  5.  *
  6.  * Revision History:
  7.  *    $Log: printf.c,v $
  8.  * Revision 1.1  1993/10/25  13:15:20  carlson
  9.  * Initial revision
  10.  *
  11.  *------------------------------------------------------------------------*/
  12.  
  13. #include <stdio.h>
  14. #include <errno.h>
  15. #include <ctype.h>
  16. #include <stddef.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <unistd.h>
  20.  
  21. enum PSIZE { Norm, Short, Long, LongLong };
  22.  
  23. union
  24. {
  25.     int             i;
  26.     long            l;
  27.     unsigned long   ul;
  28.     float           f;
  29.     double          d;
  30.     char            c;
  31.     unsigned char   uc;
  32.     char*           str;
  33. } data;
  34. char    buffer[256];
  35.  
  36. void fix_slashes (char *buff)
  37. {
  38.     char    *nbuff = buff;
  39.     int        i;
  40.  
  41.     while (*buff)
  42.     {
  43.     if (*buff == '\\')
  44.     {
  45.         buff++;
  46.         switch (*buff)
  47.         {
  48.           case 'n':
  49.         *nbuff = '\n';
  50.         break;
  51.  
  52.           case 't':
  53.         *nbuff = '\n';
  54.         break;
  55.  
  56.           case 'v':
  57.         *nbuff = '\v';
  58.         break;
  59.  
  60.           case 'b':
  61.         *nbuff = '\b';
  62.         break;
  63.  
  64.           case 'r':
  65.         *nbuff = '\r';
  66.         break;
  67.  
  68.           case 'f':
  69.         *nbuff = '\f';
  70.         break;
  71.  
  72.           case '\\':
  73.         *nbuff = '\\';
  74.         break;
  75.  
  76.           case '\'':
  77.         *nbuff = '\'';
  78.         break;
  79.  
  80.           case '"':
  81.         *nbuff = '"';
  82.         break;
  83.  
  84.           case '?':
  85.         *nbuff = '?';
  86.         break;
  87.  
  88.           case 'a':
  89.         *nbuff = '\a';
  90.         break;
  91.  
  92.           default:
  93.         if (isdigit (*buff))
  94.         {
  95.             *nbuff = '\0';
  96.             i = 0;
  97.             while (isdigit (*buff))
  98.             {
  99.             *nbuff = (*nbuff << 3) + (*buff - '0');
  100.             buff++;
  101.             i++;
  102.             if (i >= 3)
  103.                 break;
  104.             }
  105.             buff--;
  106.         }
  107.         else
  108.             *nbuff = *buff;
  109.         }
  110.     }
  111.     else
  112.         *nbuff = *buff;
  113.     buff++;
  114.     nbuff++;
  115.     }
  116.     *nbuff = '\0';
  117. }
  118.  
  119. main (int argc, char *argv[])
  120. {
  121.     char    *frmt, *cptr, *fptr, *bptr;
  122.     int        p, i;
  123.     enum PSIZE    siz;
  124.  
  125.     if (argc <= 1)
  126.     {
  127.     fprintf (stderr, "Usage: printf <format> [ <parms> ]\n");
  128.     fprintf (stderr,
  129.          "       <format>  String that follows the same rules as\n");
  130.     fprintf (stderr,
  131.          "                 the format specifier in the printf\n");
  132.     fprintf (stderr,
  133.          "                 function in C.\n");
  134.     fprintf (stderr,
  135.          "       <parms>   Parameters to be printed using the\n");
  136.     fprintf (stderr,
  137.          "                 format specified.\n");
  138.     exit (0);
  139.     }
  140.  
  141.     frmt = strdup (argv[1]);
  142.     fptr = frmt;
  143.  
  144.     for (p = 2, cptr = frmt; *cptr; )
  145.     {
  146.     siz = Norm;
  147.     if (*cptr == '%' && (*(cptr+1) != '%'))
  148.     {
  149.         if (cptr != fptr)
  150.         {
  151.         i = cptr - fptr;
  152.         strncpy (buffer, fptr, i);
  153.         buffer[i] = '\0';
  154.         fix_slashes (buffer);
  155.         printf (buffer);
  156.         fflush (stdout);
  157.         }
  158.  
  159.         bptr = buffer;
  160.         *bptr++ = *cptr++;
  161.         if (*cptr == '\0')
  162.         {
  163.         *bptr = '\0';
  164.         fix_slashes (buffer);
  165.         printf (buffer);
  166.         fflush (stdout);
  167.         break;
  168.         }
  169.         if (strchr ("-+ #", *cptr))
  170.         *bptr++ = *cptr++;
  171.         while (isdigit (*cptr) || *cptr == '.')
  172.         *bptr++ = *cptr++;
  173.         if (*cptr == 'l')
  174.         {
  175.         *bptr++ = *cptr++;
  176.         siz = Long;
  177.         if (*cptr == 'l')
  178.         {
  179.             *bptr = *cptr++;
  180.             siz = LongLong;
  181.         }
  182.         }
  183.         else if (*cptr == 'h')
  184.         {
  185.         *bptr++ = *cptr++;
  186.         siz = Short;
  187.         }
  188.         else if (*cptr == 'L')
  189.         *bptr++ = *cptr++;
  190.  
  191.         *bptr++ = *cptr;
  192.         *bptr = '\0';
  193.         switch (*cptr)
  194.         {
  195.           case 'd':
  196.           case 'i':
  197.         if (siz == Long)
  198.             printf (buffer, strtol (argv[p], NULL, 0));
  199.         else if (siz = Short)
  200.             printf (buffer, atoi (argv[p]));
  201.         else
  202.             printf (buffer, atoi (argv[p]));
  203.         fflush (stdout);
  204.         p++;
  205.         break;
  206.  
  207.           case 'o':
  208.           case 'u':
  209.           case 'x':
  210.           case 'X':
  211.         printf (buffer, strtoul (argv[p], NULL, 0));
  212.         fflush (stdout);
  213.         p++;
  214.         break;
  215.  
  216.           case 'f':
  217.         if (siz == Long)
  218.         {
  219.             sscanf (argv[p], "%ld", &data.d);
  220.             printf (buffer, data.d);
  221.         }
  222.         else
  223.         {
  224.             sscanf (argv[p], "%f", &data.f);
  225.             printf (buffer, data.f);
  226.         }
  227.         fflush (stdout);
  228.         p++;
  229.         break;
  230.  
  231.           case 'e':
  232.           case 'E':
  233.         if (siz == Long)
  234.         {
  235.             sscanf (argv[p], "%le", &data.d);
  236.             printf (buffer, data.d);
  237.         }
  238.         else
  239.         {
  240.             sscanf (argv[p], "%e", &data.f);
  241.             printf (buffer, data.f);
  242.         }
  243.         fflush (stdout);
  244.         p++;
  245.         break;
  246.  
  247.           case 'g':
  248.           case 'G':
  249.         if (siz == Long)
  250.         {
  251.             sscanf (argv[p], "%lg", &data.d);
  252.             printf (buffer, data.d);
  253.         }
  254.         else
  255.         {
  256.             sscanf (argv[p], "%g", &data.f);
  257.             printf (buffer, data.f);
  258.         }
  259.         fflush (stdout);
  260.         p++;
  261.         break;
  262.  
  263.           case 'c':
  264.         printf (buffer, *argv[p]);
  265.         fflush (stdout);
  266.         p++;
  267.         break;
  268.  
  269.           case 'C':
  270.         break;
  271.  
  272.           case 's':
  273.           case 'S':
  274.           case 'p':
  275.         printf (buffer, argv[p]);
  276.         fflush (stdout);
  277.         p++;
  278.         break;
  279.  
  280.           default:
  281.         break;
  282.         }
  283.  
  284.         cptr++;
  285.         fptr = cptr;
  286.     }
  287.     else
  288.         cptr++;
  289.     }
  290.  
  291.     if (cptr != fptr)
  292.     {
  293.     strcpy (buffer, fptr);
  294.     fix_slashes (buffer);
  295.     printf (buffer);
  296.     fflush (stdout);
  297.     }
  298. }
  299.